From d819bc4814742bd9afbb2852c26ea434e834b3b1 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sun, 8 Aug 2010 18:17:29 +0200 Subject: [PATCH] Invalidate cairo surface if resizing is not supported for target While X11 surfaces can be resized, this is not the case for Quartz surfaces. Instead of resizing we will invalidate the surface instead. By giving _gdk_windowing_set_cairo_surface_size() a boolean return value, we can signal back whether or not resizing was possible. If not possible, we invalidate the surface. --- gdk/gdkinternals.h | 6 +++--- gdk/gdkwindow.c | 17 ++++++++++++----- gdk/quartz/gdkdrawable-quartz.c | 3 ++- gdk/win32/gdkdrawable-win32.c | 3 ++- gdk/x11/gdkdrawable-x11.c | 3 ++- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 9ff1d9277a..694391d83c 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -511,9 +511,9 @@ void _gdk_display_pointer_info_foreach (GdkDisplay *display, void _gdk_window_invalidate_for_expose (GdkWindow *window, cairo_region_t *region); -void _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, - int width, - int height); +gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, + int width, + int height); cairo_surface_t * _gdk_windowing_create_cairo_surface (GdkDrawable *drawable, int width, diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 5797591b38..89f8bd7d79 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -1054,11 +1054,18 @@ recompute_visible_regions_internal (GdkWindowObject *private, width = private->abs_x + private->width; height = private->abs_y + private->height; - _gdk_windowing_set_cairo_surface_size (private->cairo_surface, - width, height); - cairo_surface_set_device_offset (private->cairo_surface, - private->abs_x, - private->abs_y); + if (_gdk_windowing_set_cairo_surface_size (private->cairo_surface, + width, height)) + { + cairo_surface_set_device_offset (private->cairo_surface, + private->abs_x, + private->abs_y); + } + else + { + cairo_surface_destroy (private->cairo_surface); + private->cairo_surface = NULL; + } } } diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c index ddb481a389..849d186ac9 100644 --- a/gdk/quartz/gdkdrawable-quartz.c +++ b/gdk/quartz/gdkdrawable-quartz.c @@ -32,12 +32,13 @@ typedef struct { CGContextRef cg_context; } GdkQuartzCairoSurfaceData; -void +gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, int width, int height) { /* This is not supported with quartz surfaces. */ + return FALSE; } static void diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c index 17ccd615a6..403ffad12b 100644 --- a/gdk/win32/gdkdrawable-win32.c +++ b/gdk/win32/gdkdrawable-win32.c @@ -670,12 +670,13 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable) return impl->cairo_surface; } -void +gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, gint width, gint height) { // Do nothing. The surface size is determined by the DC + return FALSE; } static gint diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index 02efc0d840..961dad01ab 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -461,12 +461,13 @@ gdk_x11_cairo_surface_destroy (void *data) impl->cairo_surface = NULL; } -void +gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, int width, int height) { cairo_xlib_surface_set_size (surface, width, height); + return TRUE; } cairo_surface_t * -- 2.30.2